/**
 * 
 * @author xcm
 * @description 快速排序
 * @param {*} arr 传入需要排序的数组 
 * @returns 返回处理后的数组，如果传入非数组元素，则直接返回该元素
 */
const quickSort = function (arr) {
  if(!(arr instanceof Array)){
      return arr;
  }
  if (arr.length <= 1) {
    return arr;
  }
  let pivotIndex = Math.floor(arr.length / 2);
  let pivot = arr.splice(pivotIndex, 1)[0]; //取得中间的值
  let left = [];
  let right = [];
  arr.forEach((e) => {
    if (e < pivot) {
      left.push(e);
    } else {
      right.push(e);
    }
    return e;
  });
  return quickSort(left).concat(pivot, quickSort(right));
};

/**
 * @author xcm
 * @description 冒泡排序
 * @param {*} array 传入需要处理的数组
 * @returns 返回处理后的数组，如果传入非数组元素，则直接返回该元素
 */
const sortarr = function(array){
    if(!(array instanceof Array)){
        return array;
    }
    for (let i = 0; i < array.length-1; i++) {
        for (let j = 0; j < array.length-1-i; j++) {
            if(array[j] > array[j+1]){
                let temp = array[j];
                array[j]=array[j+1];
                array[j+1]=temp;
            }
            
        }
    }
    return array;
}

/**
 * 
 * @param {*} str 字符串
 * @returns 反转字符串 
 */
const checkPalindrom = function(str) {  
    return str == str.split('').reverse().join('');
}

/**
 * @author xcm
 * @description 利用Set不重复的特性实现去重
 * @param {*} array 数组 
 * @returns 返回数组
 */
const unique = function(array){
    if(!(array instanceof Array)){
        return array;
    }
    return [...new Set(array)] 
}

/**
 * @author xcm
 * @description 递归实现深拷贝
 * @param {*} params 数组或对象
 * @returns 数组或者对象
 */
const deepCopy = function(params) {
  // 如果是数组
  if (Array.isArray(params)) {
    var res = []
    for (var i = 0; i < params.length; i++) {
      if (params[i] instanceof Object) {
        // 将深层拷贝的结果的 添加到 res 中
        res.push(this.deepCopy(params[i]))
      } else {
        res.push(params[i])
      }
    }
    return res
  }
  // 如果是对象 进行 对象的拷贝
  if (params.constructor === Object) {
    var res = {} //  1 声明空对象
    for (var x in params) {
      // 遍历被拷贝独享
      // 如果你是数组或者对象；需要再次拷贝
      if (params[x] instanceof Object) {
        // 将深层拷贝的结添加到 res中
        res[x] = this.deepCopy(params[x])
      } else {
        // params[x] 为基本类型数据 直接添加大res中
        res[x] = params[x]
      }
    }
    return res
  }
}

